package arena.busqueda;

import java.util.ArrayList;
import java.util.List;

import org.uqbar.commons.model.UserException;
import org.uqbar.commons.utils.Observable;

import domain.Asiento;
import domain.Usuario;
import domain.aerolinea.Aerolinea;
import domain.aerolinea.AerolineaOceanicAdapter;
import domain.busqueda.ParametrosDeBusqueda;
import domain.excepciones.NoPudoReservarAsientoException;

@Observable
public class BuscadorDeAsientos {
	public static final String RESULTADOS = "asientosResultado";
	public static final String ORIGEN = "origen";
	public static final String DESTINO = "destino";
	public static final String FECHA = "fecha";
	public static final String BUSCAR_ASIENTOS = "buscar";
	public static final String ASIENTO_A_OPERAR = "target";
	public static final String COMPRAR_SELECCIONADO = "comprar";
	public static String RESERVAR_SELECCIONADO = "reservar";

	private ParametrosDeBusqueda parametrosBusqueda;
	private Asiento target;
	private List<Asiento> asientosResultado = new ArrayList<Asiento>();
	private Usuario usuario;
	
	public BuscadorDeAsientos(Usuario usuario) {
		parametrosBusqueda = new ParametrosDeBusqueda();
		this.buscar();
		this.usuario=usuario; 
	}
	
	public void comprar(){
		this.getAerolineaPara().comprar(target, usuario);
	}
	
	public void reservar(){
		try{
			this.getAerolineaPara().reservar(target, usuario);
		}catch (NoPudoReservarAsientoException e) {
			throw new UserException("Ha ocurrido un error en su reserva: "+e.getMessage()+"\nPor favor intente nuevamente");
		}
	}
	
	public void buscar(){
		this.setAsientosResultado(this.getAerolineaPara().buscar(parametrosBusqueda));
	}
	
	protected Aerolinea getAerolineaPara() {
		return new AerolineaOceanicAdapter();
	}

	public Asiento getTarget() {
		return target;
	}

	public void setTarget(Asiento target) {
		this.target = target;
	}

	public String getOrigen(){
		return parametrosBusqueda.getOrigen();
	}
	
	public void setOrigen(String origen){
		parametrosBusqueda.setOrigen(origen);
	}

	public String getDestino(){
		return parametrosBusqueda.getDestino();
	}
	
	public void setDestino(String destino){
		parametrosBusqueda.setDestino(destino);
	}
	
	public String getFecha(){
		return parametrosBusqueda.getFechaDeSalida();
	}
	
	public void setFecha(String fecha){
		parametrosBusqueda.setFechaDeSalida(fecha);
	}

	public List<Asiento> getAsientosResultado() {
		return asientosResultado;
	}

	public void setAsientosResultado(List<Asiento> resultados) {
		this.asientosResultado = resultados;
	}

	public void agregarResultado() {
		List<Asiento> temp = this.asientosResultado;
		temp.add(new Asiento("", 666, "", "", ""));
		this.asientosResultado = null;
		this.asientosResultado = temp;
		
	}
}
